﻿using System;
using System.Xml;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using Microsoft.Ink;
using ICSharpCode.SharpZipLib.Zip;
using Modele;
using vue;


namespace Sauvegarde
{
    class writer1
    {

        Modele.Modele m;


        public writer1(Modele.Modele mod)
        {
            m = mod;
        }


        /**
         * ajouter un fichier à l'archive zip
         */
       static void ecrireDansPan(ZipFile zip,String fichier)
        {
            //initialize the file so that it can accept updates
            zip.BeginUpdate();

            //add the file to the zip file
            zip.Add(fichier);

            //commit the update once we are done
            zip.CommitUpdate();
            //close the file
            zip.Close();
        }

        //à changer paramètre, prend normalement l'url, voir pour récupérer le projet
        public void ecrireUPX(String cheminAbs)
        {

            String chemin = ManipulationChaine.extension(cheminAbs);
            String nomFichier = ManipulationChaine.fichierPan(cheminAbs);

            //create our zip file
            ZipFile z = ZipFile.Create(cheminAbs);

            // Create a new file
            //TODO mettre le bon nom de fichier et le bon repertoire (voir au niveau de l'archive)
            //TODO au secours !!!! comment ajouter les fichiers dans l'archive ? Il faut les créer avant, mais où?, et les supprimer ensuite ?

            String nom_upx = "sauvegarde.xml";

            XmlTextWriter textWriter = new XmlTextWriter(nom_upx, null);

            // Opens the document

            textWriter.WriteStartDocument();

            // Write comments

            textWriter.WriteComment("Document XML de sauvegarde de projet PAN au format UPX");

            //TODO commentaire à modifier avec le bon nom de fichier
            textWriter.WriteComment("sauvegarde.upx dans le projet" + nomFichier);

            ProjetBlocNote p = m.getProjet();

            //String urlimg = m.getProjet().getUrlImage();

            /*if (!m.getProjet().getUrlImage().Equals(""))
            {
                textWriter.WriteStartElement("image");
                textWriter.WriteAttributeString("url_image", m.getProjet().getUrlImage());
                textWriter.WriteEndElement();
            }*/

            //élément racine
            textWriter.WriteStartElement("sauvegarde");

            //nombre de pages (peu pertinent maintenant vu que pas de PDF)
            textWriter.WriteStartElement("nbPages");
            textWriter.WriteAttributeString("nb", "" + m.getProjet().getNbrPage());
            textWriter.WriteEndElement();

            IEnumerator e = m.getProjet().getBlocCourant().GetEnumerator();
              int i = 0;
              int j = 0;
              //int k = 0;
            while (e.MoveNext())
            {
                Couche couche1 = (Couche)e.Current;

                    //niveau couche
                    textWriter.WriteStartElement("visibiliteCouche");
                    textWriter.WriteAttributeString("idcouche", "" + i);
                    if (couche1.estVisible())
                    {
                        textWriter.WriteAttributeString("visible", "oui");
                    }
                    else
                    {
                        textWriter.WriteAttributeString("visible", "non");
                    }
                    i++;

                    foreach (Calque calque1 in couche1.getCouche())
                    {

                        /*
                        //niveau page
                        if ((obj.GetType()).Equals(Page))
                        {
                            textWriter.WriteStartElement("hlevel");
                            textWriter.WriteAttributeString("level", "page");
                            textWriter.WriteAttributeString("id", "page" + i);
                            i++;
                            }*/

                        //niveau calque

                        textWriter.WriteStartElement("hlevel");
                        textWriter.WriteAttributeString("level", "calque");
                        textWriter.WriteAttributeString("idcalque", "" + j);


                        String nom_calque = "sauvegarde_calque" + j + ".inkml";

                        textWriter.WriteAttributeString("url_calque", "" + nom_calque);

                        //sauvegarde de l'attribut encre du calque sous le nom du projet suivi du numéro du calque
                        
                        EnregistrementPAN enre = new EnregistrementPAN();
                        enre.enregistrer(calque1.encre,"" + chemin + "\\" + nom_calque);
                        //ecrireDansPan(z,nom_calque);
                        //TODO supprimer le fichier une fois ajouté à l'archive .pan


                        //initialize the file so that it can accept updates
                        z.BeginUpdate();

                        //add the file to the zip file
                        z.Add(nom_calque);

                        //commit the update once we are done
                        z.CommitUpdate();
                        //close the file
                        //z.Close();



                        j++;


                        //int m = 0;
                        int n = 0;
                        int o = 0;


                        IDictionaryEnumerator an = calque1.annotations_map.GetEnumerator();
                        while (an.MoveNext())
                        {
                            AnnotationPAN anno = (AnnotationPAN)an.Value;

                            //TODO voir pour l'image bitmap
                            //Balises

                            Type d = anno.GetType();
                            Balise b = new Balise();
                            if (d == b.GetType())
                            {
                                //ouverture niveau balise
                                textWriter.WriteStartElement("hlevel");
                                textWriter.WriteAttributeString("level", "balise");
                                textWriter.WriteAttributeString("idbalise", "" + n);

                                //TODO sauvegarder un lien vers l'image correspondante
                                String url_balise = "" + chemin + "\\icone_balise" + n + ".bmp";
                                textWriter.WriteAttributeString("url_icone_balise",""+url_balise);

                                
                                //ecrireDansPan(z, url_balise);

                                
                                
                                //position
                                textWriter.WriteStartElement("position");
                                textWriter.WriteAttributeString("positionX", "" + anno.getPosition().getPosX());
                                textWriter.WriteAttributeString("positionY", "" + anno.getPosition().getPosY());
                                textWriter.WriteEndElement();


                                //auteur
                                textWriter.WriteStartElement("auteur");
                                textWriter.WriteAttributeString("prenom", "" + anno.getPrenom());
                                textWriter.WriteAttributeString("nom", "" + anno.getNom());
                                textWriter.WriteEndElement();


                                //sémantique
                                textWriter.WriteStartElement("label");
                                textWriter.WriteStartElement("alternate");

                                String sann = anno.getSemantique().getSignification();
                                textWriter.WriteString("" + sann);
                                
                                textWriter.WriteEndElement();
                                textWriter.WriteEndElement();
                                
                                
                                n++;

                                //fermeture niveau balise
                                textWriter.WriteEndElement();

                            }
                            else
                            {
                                Texte tx = new Texte();
                                if (d.GetElementType() == tx.GetType())
                                {

                                    //texte
                                    //ouverture niveau texte
                                    textWriter.WriteStartElement("hlevel");
                                    textWriter.WriteAttributeString("level", "texte");
                                    textWriter.WriteAttributeString("idtexte", "" + o);
                                    String tex = ((Texte)anno).getIcone();
                                    textWriter.WriteAttributeString("att_texte", tex);

                                    //position
                                    textWriter.WriteStartElement("position");
                                    textWriter.WriteAttributeString("positionX", "" + anno.getPosition().getPosX());
                                    textWriter.WriteAttributeString("positionY", "" + anno.getPosition().getPosY());
                                    textWriter.WriteEndElement();
                                   
                                    

                                    //sémantique
                                    textWriter.WriteStartElement("label");
                                    textWriter.WriteStartElement("alternate");
                                    String sann = anno.getSemantique().getSignification();
                                    textWriter.WriteString("" + sann);
                                    textWriter.WriteEndElement();
                                    textWriter.WriteEndElement();

                                    o++;

                                    //fermeture niveau texte
                                    textWriter.WriteEndElement();
                                }//fermeture du if
                            }//fermeture du else
                            
                        }//fermeture du while sur les annotations

                        //fermeture niveau calque
                        textWriter.WriteEndElement();

                    }//fermeture du foreach sur les calques

                    //fermeture niveau couche
                    textWriter.WriteEndElement();

            }//fermeture du while sur les couches

            //fin élément racine
            textWriter.WriteEndElement();

            textWriter.Close();

            //ecrireDansPan(z, nom_upx);
            //TODO effacer le fichier après l'avoir ajouter à l'archive

            //initialize the file so that it can accept updates
            z.BeginUpdate();

            //add the file to the zip file
            z.Add(nom_upx);

            //commit the update once we are done
            z.CommitUpdate();
            //close the file
            z.Close();

        }
    }
}